export namespace utils {

    export function randomInt(min: number, max: number) {
        return Math.floor(Math.random() * (max - min + 1) + min);
    }

    export function maxBigint(arr: bigint[]): bigint | null {
        if (arr.length === 0) {
            console.warn("数组为空，无法计算最大值。");
            return null;
        }
        return arr.reduce((a, b) => a > b ? a : b);
    }

    export function minBigint(arr: bigint[]): bigint | null {
        if (arr.length === 0) {
            console.warn("数组为空，无法计算最小值。");
            return null;
        }
        return arr.reduce((a, b) => a < b ? a : b);
    }

    export function timeDurationFormat(timeMs: number): string {
        const seconds = Math.floor(timeMs / 1000)
        const minutes = Math.floor(seconds / 60)
        const hour = Math.floor(seconds / 3600)
        const day = Math.floor(seconds / 14400)

        if (seconds <= 60) {
            return seconds + '秒'
        } else if (seconds <= 3600) {
            return minutes + '分' + (seconds - minutes * 60) + '秒'
        } else if (seconds <= 14400) {
            return hour + '小时' + (minutes - hour * 60) + '分' + (seconds - minutes * 60) + '秒'
        }
        return day + '天' + (hour - day * 24) + '小时' + (minutes - hour * 60) + '分' + (seconds - minutes * 60) + '秒'
    }

    /**
     * 计算从线段上某点垂直延伸的末端坐标
     * @param x1 点1的x坐标
     * @param y1 点1的y坐标
     * @param x2 点2的x坐标
     * @param y2 点2的y坐标
     * @param d 从点1到点2连线上的距离
     * @param h 从d定义的点沿垂直方向上的距离
     * @returns 垂直连线末端的坐标 {x, y}
     */
    export function calculatePerpendicularPoint(
        x1: number,
        y1: number,
        x2: number,
        y2: number,
        d: number,
        h: number
    ): { x: number; y: number } {
        // 计算线段的方向向量
        const dx = x2 - x1;
        const dy = y2 - y1;

        // 计算线段的长度
        const length = Math.sqrt(dx * dx + dy * dy);

        // 如果线段长度为0，则两点重合，无法确定方向
        if (length === 0) {
            throw new Error("两点重合，无法确定线段方向");
        }

        // 计算单位方向向量
        const unitDx = dx / length;
        const unitDy = dy / length;

        // 计算线段上的点P (从点1出发，距离为d的点)
        const px = x1 + unitDx * d;
        const py = y1 + unitDy * d;

        // 计算垂直方向向量 (顺时针和逆时针两个方向)
        // 这里我们选择逆时针垂直方向
        const perpendicularDx = -unitDy;
        const perpendicularDy = unitDx;

        // 计算垂直方向上的点
        const x = px + perpendicularDx * h - x1;
        const y = py + perpendicularDy * h - y1;

        return {x, y};
    }
}